// utils/storage.js
class Storage {
  //static 静态方法，不需要实例化，直接调用，this指向undefined
  // Cookie操作:通常用encodeURIComponent编码
  static setCookie(name, value, days = 7, options = {}) {
    const expires = new Date(Date.now() + days * 864e5).toUTCString();
    console.log('expires????',expires);
    // document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`;
    // 处理对象值自动序列化
    const stringValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
    const encodedValue = encodeURIComponent(stringValue);
    let cookieString = `${name}=${encodedValue}`;
    // 设置过期时间（days为null表示会话cookie）
    if (days !== null) {
      const expires = new Date(Date.now() + days * 86400000).toUTCString();
      cookieString += `; expires=${expires}`;
    }
    // 设置其他参数
    if (options.path) cookieString += `; path=${options.path}`;
    if (options.domain) cookieString += `; domain=${options.domain}`;
    if (options.secure) cookieString += '; secure';
    if (options.httponly) cookieString += '; httponly';
    if (options.samesite) cookieString += `; samesite=${options.samesite}`;
    document.cookie = cookieString;
  }
  
  static getCookie(name) {
    const value = `; ${document.cookie}`;
    const parts = value.split(`; ${name}=`);
    console.log('value',name,value,parts);
    
    return parts.length === 2 ? decodeURIComponent(parts.pop().split(';')[0]) : null;
  }
 /**
   * 删除Cookie
   * @param {string} name - cookie名称
   * @param {string} path - 路径（需与设置时一致）
   */
  static removeCookie(name, path = '/') {
    document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}`;
  }
  /**
   * 批量删除Cookie
   * @param {string[]} names - cookie名称数组
   */
  static removeCookies(names) {
    names.forEach(name => this.removeCookie(name));
  }
  // LocalStorage操作（带JSON序列化）
  static setLocal(key, value) {
    try {
      localStorage.setItem(key, JSON.stringify(value));
    } catch (e) {
      if (e.name === 'QuotaExceededError') {
        console.error('存储空间不足');
        // 清理旧数据或提示用户
      }
    }
  }
  static removeLocal(key) {
    localStorage.removeItem(key);
  }
  
  static getLocal(key) {
    try {
      return JSON.parse(localStorage.getItem(key));
    } catch {
      return null;
    }
  }
  
  // SessionStorage操作
  static setSession(key, value) {
    sessionStorage.setItem(key, JSON.stringify(value));
  }
  
  static getSession(key) {
    try {
      return JSON.parse(sessionStorage.getItem(key));
    } catch {
      return null;
    }
  }
  static removeSession(key) {
   sessionStorage.removeItem(key);
  }
}

export default Storage;
// Cookie值、LocalStorage/SessionStorage也只能存储字符串，
// 因此对象、数组等复杂数据类型需要转换为字符串，保持数据结构,如果不序列号会丢失类型信息
// const data = { numbers: [1, 2, 3], flag: true, text: "hello" };
// localStorage.setItem('data', JSON.stringify(data));
// localStorage.setItem('data', data.toString());//// "[object Object]" - 丢失所有数据！不能正确的恢复数据结构和类型
//cookie 复制标签新开一个标签页，cookie还在，直到关闭浏览器(没设置过期时间)或者到期后消失///不设置过期时间，默认用户关闭浏览器（非标签）就消失
//cookie: 4kb
//localStorage 复制标签，只要不跨域的网址，localstorage还在，除非手动删除///5~10mb
// sessionstorage 赋值标签页新开一个标签页，缓存就不在了///5~10mb
//这几个都是同步的，敏感数据加密存储，最好存在服务端
// import CryptoJS from 'crypto-js';import { sm2 } from "sm-crypto";
// 关于同源策略，
// sessionStorage和localstorage严格在同源上存在，跨域就不存在了，
// 但cookie要看domain属性设置,没设置只在当前域名有效，跟上面一样，一旦设置了domain,就按他的来，可以设置子域名共享等
// 批量操作减少IO：一次性存储obj,不要多次存储
// 存储敏感数据的注意事项
// 不要存储密码在客户端存储中
// 敏感信息使用短期Cookie或服务端Session
// 重要数据需要加密存储
// 定期清理过期数据
// 特性	Cookie	LocalStorage	SessionStorage	安全建议
// 大小	4KB	5-10MB	5-10MB	5-10MB
// JavaScript访问	可控制（HttpOnly）	完全可访问	完全可访问	敏感数据用HttpOnly
// 传输安全	可控制（Secure）	不涉及传输	不涉及传输	生产环境启用Secure
// 跨域限制	可配置子域名	严格同源	严格同源	重要数据服务端存储
// XSS防护	优秀（HttpOnly）	无防护	无防护	配合CSP策略
// 数据篡改	难（HttpOnly）	容易	容易	服务端验证关键数据
// 总结
// 根据您的使用场景选择合适的存储方式：
// 需要服务端访问：使用Cookie
// 长期保存的用户偏好：使用LocalStorage
// 临时会话数据：使用SessionStorage
// 认证令牌：推荐使用Cookie（HttpOnly + Secure）
// Cookie: 4KB左右，每个域名约50个
// 关于sessonstorage的使用---------------------------
    // 使用场景：多步骤表单数据暂存
    // 使用场景：页面刷新时的状态保持
    // 使用场景：临时数据处理
    // 使用场景：单次会话的临时配置
    // 特点：标签页级别：每个标签页独立存储
    // 特点：会话级别：关闭标签页后数据清除
    // 特点：大小限制：约5-10MB
    // 特点：同源策略：同域名同标签页共享
// 关于localstorage的使用---------------------------
    // 使用场景：仅客户端：服务端无法直接访问
    // 使用场景：持久存储：数据永久保存，除非手动删除
    // 使用场景：大小限制：约5-10MB（不同浏览器有差异）
    // 使用场景：同源策略：同域名下所有页面共享
    // 特性：用户偏好设置（主题、语言等）
    // 特性：离线数据缓存
    // 特性：表单数据暂存
    // 特性：应用配置信息
// 设置数据：session和local使用方法一样
// localStorage.setItem('user', JSON.stringify({name: '张三', age: 25}));
// // 获取数据
// const user = JSON.parse(localStorage.getItem('user'));
// // 删除单个数据
// localStorage.removeItem('user');
// // 清空所有数据
// localStorage.clear();
// // 获取键名
// const key = localStorage.key(0); // 获取第一个键名
// const length = localStorage.length; // 获取存储项数量